<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form id="myForm">
        <input type="text" name="username"><br>
        <input type="text" name="password"><br>
        <input type="file" name="pic" onchange="printFile(this)">
    </form>
    <input type="button" value="发送ajax上传文件" onclick="sendAjax()">
    <script>

        // 文件选择器的DOM对象.files 
        function printFile(fileDom){

            //文件数据对象：js用于描述文件信息的File对象数据(文件名称，大小，格式，文件二进制数据(隐藏))
            console.log(fileDom.files[0]);
        }

        /* 
        ajax完成文件上传，需要注意如下步骤：
            1.请求类型必须具有请求体的相关请求post、put
            2.ajax的提供参数必须是以FormData构造器创建二进制数据对象
            3.ajax请求时参数以FormData实例对象直接为send方法的参数进行定义

           FormData:是js提供用于在js代码构成的二进制数据参数的特殊构造器
            该构造器创建的实例对象可以接收普通数据参数，也可以接收js加载的文件数据对象

            xhr的send方法如果参数接收FormData构造器创建的数据参数
                无论FormData构建的实例对象中，是否携带文件信息，当前的ajax Content-Type都会被自动设置为multipart/form-data

        */
        function sendAjax(){

         
            let xhr=new XMLHttpRequest();
            xhr.open("post","/params/body");
            
            //普通文本数据
            let username=document.querySelector("input[name='username']").value;
            let password=document.querySelector("input[name='password']").value;

            //文件对象数据
            let fileDom=document.querySelector("input[name='pic']");
            let pic=fileDom.files[0];//文件对象数据

            let fd=new FormData();
            fd.append("username",username);
            fd.append("password",password);
            fd.append("pic",pic);



            xhr.onload=function(){
                console.log(xhr.responseText);
            };

            //有效的带有二进制文件信息的数据
            xhr.send(fd);
        }
    </script>
</body>
</html>